package clases;
import java.util.ArrayList;

import value_objects.VOBola;
import value_objects.VODataJuego;

public class Juego {
	private static int maxBolas = 3;
	private static int maxJugadores = 3;
	private ArrayList<ArrayList<Punto>> jugadores;
	private int countBolas;
	private int countJugadores;
	
	private static Juego instance = null;
	
	private Juego() {
		jugadores = new ArrayList<ArrayList<Punto>>(maxJugadores);
		countJugadores = 0;
	}
	
	public static Juego getInstance() {
		if (instance == null) {
			instance = new Juego();
		}
		return instance;
	}
	
	public int[] conectar() {
		int[] retorno;
		retorno = new int[3];
		if (countJugadores < maxJugadores) {
			if(countJugadores==1){
				ArrayList<Punto> bolas = new ArrayList<Punto>(maxBolas);
				bolas.add(0, new Punto(countJugadores*countBolas*20 +10, 20));
				countBolas++;
				bolas.add(1, new Punto(countJugadores*countBolas*20 +10, 20));
				countBolas++;
				bolas.add(2, new Punto(countJugadores*countBolas*20 +10, 20));
				retorno[1] = countBolas++;
				retorno[2] = maxBolas;
				jugadores.add(countJugadores, bolas);
			}else{
				ArrayList<Punto> bolas = new ArrayList<Punto>(1);
				bolas.add(0, new Punto(countJugadores*countBolas*20 +10, 40));
				retorno[1] = countBolas++;
				retorno[2] = 1;
				jugadores.add(countJugadores, bolas);
			}
			// las bolas arrancan una al lado de la otra
			retorno[0] = countJugadores++;
		} else {
			retorno[0] = -1;
		}
		return retorno;
	}
	
	public void coordenadas (int _idJugador, int _idBola, int _x, int _y) {
		Punto b = jugadores.get(_idJugador).get(_idBola);
		int x_actual = b.getX();
		int y_actual = b.getY();
		
		//Calculo de distancia constante
		int x_total = Math.abs(_x - x_actual);
		int y_total = Math.abs(_y - y_actual);
		double h_total = Math.sqrt(Math.hypot(x_total, y_total));
		double cos = x_total / h_total;
		double sin = y_total / h_total;
		int x_final = (int) Math.abs(Math.floor(cos * 10));
		int y_final = (int) Math.abs(Math.floor(sin * 10));
		
		if ((_x - x_actual) < 0 ) {
			x_final = Math.max( 0 , x_actual - x_final);
		} else {
			x_final = x_actual + x_final;
		}
		if ((_y - y_actual) < 0 ) {
			y_final = Math.max( 0 , y_actual - y_final);
		} else {
			y_final = y_actual + y_final;
		}
		
		b.setX(x_final);
		b.setY(y_final);
	}
	
	synchronized public VODataJuego dataJuego() {
		int count=0;
		VOBola[] ret = new VOBola[countBolas];
		for (int i = 0; i < countJugadores; i++) {
			int len = jugadores.get(i).size();
			for ( int r = 0; r < len; r++) {
				if ( count <= countBolas ) {
					Punto tmp = jugadores.get(i).get(r);
					ret[count] = new VOBola(count, tmp.getX(), tmp.getY());
					count++;
				}
			}
		}
		return new VODataJuego(ret, countBolas);
	}
}
